package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @ClassName CategoryServiceImpl
 * @Description 分类管理业务层实现类
 * @Author sld
 * @Date 2024/7/4 9:10
 * Version 1.0
 **/
@Service
public class CategoryServiceImpl implements CategoryService {
    // 分类表持久层映射接口
    @Resource
    private CategoryMapper categoryMapper;
    // 菜品表持久层映射接口
    @Resource
    private DishMapper dishMapper;
    // 套餐表持久层映射接口
    @Resource
    private SetmealMapper setmealMapper;
    /**
     * 分类管理的分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    @Override
    public PageResult page(CategoryPageQueryDTO categoryPageQueryDTO) {
        // 校验分页参数
        if(categoryPageQueryDTO.getPageSize() < 3 ||
            categoryPageQueryDTO.getPageSize() > 20
        ){
            categoryPageQueryDTO.setPageSize(10); // 重设为默认的每页10条
        }
        // 设置分页参数，下一次开始分页查询
        PageHelper.startPage(categoryPageQueryDTO.getPage(),
                categoryPageQueryDTO.getPageSize());
        // 执行查询
        Page page =  categoryMapper.page(categoryPageQueryDTO);
        // 封装结果并返回
        PageResult pageResult = new PageResult(
                page.getTotal(),    // 获取总记录数
                page.getResult()    // 获取查询结果的数据
        );
        return pageResult;
    }

    /**
     * 新增分类
     * @param categoryDTO
     */
    @Override
    public void save(CategoryDTO categoryDTO) {
        // 创建实体类对象
        Category category = new Category();
        // 复制数据
        BeanUtils.copyProperties(categoryDTO,category);
        // 设置分类状态
        category.setStatus(StatusConstant.DISABLE);
        // 调用持久层保存数据的方法
        categoryMapper.insert(category);
    }

    /**
     * 修改分类
     * @param categoryDTO
     */
    @Override
    public void update(CategoryDTO categoryDTO) {
        // 创建实体类对象
        Category category = new Category();
        // 复制数据
        BeanUtils.copyProperties(categoryDTO,category);
        // // 设置日志记录字段的数据
        // category.setUpdateTime(LocalDateTime.now());
        // category.setUpdateUser(BaseContext.getCurrentId());
        // 调用持久层保存数据的方法
        categoryMapper.update(category);
    }

    /**
     * 根据id删除分类
     * @param id
     */
    @Override
    public void delete(Long id) {
        /* 检查从表有没有数据 */
        Long dishNum = dishMapper.listByCid(id);
        if(dishNum>0){  // 菜品表中有外键关联数据
            // 抛出异常
            throw new DeletionNotAllowedException(
                    MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
        }
        Long setmealNum =  setmealMapper.listByCid(id);
        if(setmealNum>0){ // 套餐中有外键关联关系
            // 抛出异常
            throw new DeletionNotAllowedException(
                    MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);
        }
        // 删除主表数据
        categoryMapper.deleteById(id);
    }

    /**
     * 根据id修改分类状态
     * @param status
     * @param id
     */
    @Override
    public void updateStatus(Integer status, Long id) {
        // 构建对象，并赋值 （实体类中添加了@Builder注解才可以使用这种方式）
        Category category = Category.builder()
                .id(id)     // 赋值
                .status(status)     // 复制
                .build();   // 创建对象
        // 调用持久层修改方法
        categoryMapper.update(category);
    }

    /**
     * 根据类型查询分类信息
     * @param type
     * @return
     */
    @Override
    public List<Category> list(Integer type) {

        // 调用持久层根据类型查询分类的方法
        List<Category> list =  categoryMapper.findByType(type);
        return list;
    }
}
